package util

import (
	"fmt"
	"gg_server/response"
	"time"

	"github.com/golang-jwt/jwt/v5"
)

// 创建jwt 结构体
type MyJwt struct {
	// 用户的id
	Id int `json:"id"`
	// 用户昵称
	Name string `json:"name"`
}

// 签发的密钥
const jwtSecret string = "vvgg_server"

// 创建 token
func (m *MyJwt) CreateJwt() string {
	// 创建token
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
		"id":   m.Id,
		"name": m.Name,
		// 签发时间
		"iat": time.Now().Unix(),
		// 过期时间   一个月
		"exp": time.Now().Add(time.Hour * 24 * 30).Unix(),
	})

	tokenString, err := token.SignedString([]byte(jwtSecret))
	if err != nil {
		response.GetError().ServerError(fmt.Sprintf("签发token失败，err:%v", err))
	}

	return tokenString
}

// 校验 token
func (m *MyJwt) VerifyJwt(tokenString string) bool {

	// 通过 tokenString 转成 token
	token, err := jwt.Parse(tokenString, func(t *jwt.Token) (interface{}, error) {
		if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok {
			return nil, fmt.Errorf("token签名方法错误")
		}
		return []byte(jwtSecret), nil
	})

	if err != nil {
		fmt.Println(err)
		return false
	}

	claims, ok := token.Claims.(jwt.MapClaims)

	if !(ok && token.Valid) {
		return false
	}

	m.Id = int(claims["id"].(float64))
	m.Name = claims["name"].(string)

	return true
}
